/**
 * 值不等于undefined或null，则条件为真
 */
function isDef(value) {
  return value !== undefined && value !== null
}

/**
 * 值等于任意一个，则条件为真
 */
function isUndef(value) {
  return value === undefined || value === null
}

/**
 * 判断是否为空
 */
function isEmpty(value) {
  switch (typeof value) {
    case 'undefined':
      return true
    case 'string':
      if (value.replace(/(^[ \t\n\r]*)|([ \t\n\r]*$)/g, '').length == 0) return true
      break
    case 'boolean':
      if (!value) return true
      break
    case 'number':
      if (0 === value || isNaN(value)) return true
      break
    case 'object':
      if (null === value || value.length === 0) return true
      for (var i in value) {
        return false
      }
      return true
  }
  return false
}

/**
 * 值等于true，则条件为真
 */
function isTrue(value) {
  return value === true
}

/**
 * 值等于false，则条件为真
 */
function isFalse(value) {
  return value === false
}

/**
 * 验证电子邮箱格式
 */
function email(value) {
  return /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/.test(value)
}

/**
 * 验证方法
 */
function isFunction(value) {
  return Object.prototype.toString.call(value) === '[object Function]'
}

/**
 * 验证手机格式
 */
function mobile(value) {
  return /^1[23456789]\d{9}$/.test(value)
}

/**
 * 验证密码格式
 */
function password(value) {
  return /^[a-zA-Z\d\-_&:;\'<>,=%`~!@#\(\)\$\^\*\+\|\{\}\[\]\.\?\/\\]{6,20}$/.test(value)
}

/**
 * 验证身份证号码
 */
function idCard(value) {
  return /^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(value)
}

/**
 * 是否对象
 */
function object(value) {
  return Object.prototype.toString.call(value) === '[object Object]'
}

/**
 * 是否json
 */
function isJson(value) {
  return object(value) && value.constructor == Object
}

/**
 * 是否数组
 */
function array(value) {
  if (typeof Array.isArray === 'function') {
    return Array.isArray(value)
  } else {
    return Object.prototype.toString.call(value) === '[object Array]'
  }
}

function inArray(search, array) {
  for (var i in array) {
    if (array[i] == search) {
      return true
    }
  }
  return false
}

/**
 * 是否json字符串
 */
function jsonString(value) {
  if (typeof value == 'string') {
    try {
      var obj = JSON.parse(value)
      if (typeof obj == 'object' && obj) {
        return true
      } else {
        return false
      }
    } catch (e) {
      return false
    }
  }
  return false
}

/**
 * 只能是字母或者数字
 */
function enOrNum(value) {
  //英文或者数字
  let reg = /^[0-9a-zA-Z]*$/g
  return reg.test(value)
}

/**
 * 只能输入字母
 */
function letter(value) {
  return /^[a-zA-Z]*$/.test(value)
}

/**
 * 金额,只允许2位小数
 */
function amount(value) {
  //金额，只允许保留两位小数
  return /^[1-9]\d*(,\d{3})*(\.\d{1,2})?$|^0\.\d{1,2}$/.test(value)
}

/**
 * 验证整数
 */
function digits(value) {
  return /^\d+$/.test(value)
}

/**
 * 验证十进制数字
 */
function number(value) {
  return /^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(value)
}

/**
 * 验证URL格式
 */
function url(value) {
  return /^((https|http|ftp|rtsp|mms):\/\/)(([0-9a-zA-Z_!~*'().&=+$%-]+: )?[0-9a-zA-Z_!~*'().&=+$%-]+@)?(([0-9]{1,3}.){3}[0-9]{1,3}|([0-9a-zA-Z_!~*'()-]+.)*([0-9a-zA-Z][0-9a-zA-Z-]{0,61})?[0-9a-zA-Z].[a-zA-Z]{2,6})(:[0-9]{1,4})?((\/?)|(\/[0-9a-zA-Z_!~*'().;?:@&=+$,%#-]+)+\/?)$/.test(
    value
  )
}

/**
 * 验证日期格式
 */
function date(value) {
  return !/Invalid|NaN/.test(new Date(value).toString())
}

/**
 * 验证ISO类型的日期格式
 */
function dateISO(value) {
  return /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(value)
}

/**
 * 值
 */
function getDefValue(value, _default) {
  if (isDef(value)) {
    return value
  }
  return _default
}

/**
 * 合并资源
 * @Author   Martinsun<syh@sunyonghong.com>
 * @DateTime 2020-02-16
 * @param    {object|array} source 原始资源
 * @param    {object|array} target 对比数据
 * @return   无返回值,直接改变source
 */
function extend(source, target) {
  for (var key in target) {
    if (source[key] === undefined) {
      // 不冲突的，直接赋值
      source[key] = target[key]
      continue
    }
    var isJson = jsonString(target[key])
    if (!jsonString(source[key]) && isJson) {
      source[key] = {}
    }
    // 冲突了，如果是Object，看看有么有不冲突的属性
    // 不是Object 则以main为主，忽略即可。故不需要else
    if (isJson) {
      // arguments.callee 递归调用，并且与函数名解耦
      arguments.callee(source[key], target[key])
    } else {
      source[key] = target[key]
    }
  }
}

/**
 * @desc  函数防抖，用于将多次执行变为最后一次执行
 * @param {function} func - 需要使用函数防抖的被执行的函数。必传
 * @param {Number} wait - 多少毫秒之内触发，只执行第一次，默认1000ms。可以不传
 */
export function debounce(fn, delay) {
  delay = delay || 1000 //默认1s后执行
  let timer = null
  return function() {
    let context = this
    let arg = arguments
    if (timer) {
      clearTimeout(timer)
    }
    timer = setTimeout(() => {
      fn.apply(context, arg)
    }, delay)
  }
}

/**
 * 节流函数, 用于将多次执行变为每隔一段时间执行
 * @param fn 事件触发的操作
 * @param delay 间隔多少毫秒需要触发一次事件
 */
export function throttle2(fn, delay) {
  let timer = null
  return function() {
    let context = this
    let args = arguments
    if (!timer) {
      timer = setTimeout(function() {
        fn.apply(context, args)
        clearTimeout(timer)
      }, delay)
    }
  }
}

// 去除富文本的标签
export function delHtmlTag(html = '', len = 30, alt = '[图片]') {
  // 获取图片
  let img = []
  html.replace(/<img [^>]*src=['"]([^'"]+)[^>]*>/g, (match, capture) => {
    img.push(alt)
  })

  // 获取内容
  let reg = new RegExp('<.+?>|&nbsp;', 'g') //匹配html标签的正则表达式
  let text = html.replace(reg, '') //执行替换成空字符
  let content = text + img.join('')
  if (content.length > len) {
    return content.substring(0, len) + '...'
  } else {
    return content
  }
}

export function addLight(color, amount) {
  const cc = parseInt(color, 16) + amount
  const c = cc > 255 ? 255 : cc
  return c.toString(16).length > 1 ? c.toString(16) : `0${c.toString(16)}`
}

export function lighten(color, amount) {
  color = color.indexOf('#') >= 0 ? color.substring(1, color.length) : color
  amount = Math.trunc((255 * amount) / 100)
  return `#${addLight(color.substring(0, 2), amount)}${addLight(
    color.substring(2, 4),
    amount
  )}${addLight(color.substring(4, 6), amount)}`
}

export function hexToRgba(color, alpha = 100) {
  alpha = alpha / 100
  color = color.indexOf('#') >= 0 ? color.substring(1, color.length) : color
  let r = parseInt(color.slice(0, 2), 16)
  let g = parseInt(color.slice(2, 4), 16)
  let b = parseInt(color.slice(4, 6), 16)
  return 'rgba(' + r + ', ' + g + ', ' + b + ', ' + alpha + ')'
}

// 添加单位，如果有px，%，px等单位结尾或者值为auto，直接返回，否则加上px单位结尾
function addUnit(value = 'auto', unit = 'px') {
  value = String(value)
  // 用uView内置验证规则中的number判断是否为数值
  return number(value) ? `${value}${unit}` : value
}

export default {
  isDef,
  isUndef,
  isTrue,
  isFalse,
  isFunction,
  email,
  mobile,
  password,
  idCard,
  isEmpty,
  object,
  array,
  inArray,
  isJson,
  jsonString,
  enOrNum,
  letter,
  amount,
  digits,
  number,
  url,
  date,
  dateISO,
  extend,
  getDefValue,
  delHtmlTag,
  addLight,
  lighten,
  hexToRgba,
  addUnit
}
